/*alu control 根据aluop和aluop生成alucontrol码*/
module AluControl (
    input [3:0]alu_op,
    input [5:0] fun,
    output reg [3:0] alu_ctr
);

    

    //输入 ALUOP
    parameter   SL_ALUOP     = 4'b0000;
    parameter   BR_ALUOP     = 4'b0001;
    parameter   AL_ALUOP     = 4'b0010;
    parameter   LU_ALUOP     = 4'b0011;
    parameter   ADDI_ALUOP   = 4'b0100;
    parameter   ORI_ALUOP    = 4'b0101; 
    parameter   ANDI_ALUOP   = 4'b0110;
    parameter   XORI_ALUOP   = 4'b0111;
    parameter   SLTI_ALUOP   = 4'b1000;

    //function码
    parameter   ADD   = 6'b100000;                  
    parameter   ADDU  = 6'b100001;                  
    parameter   SUB   = 6'b100010;
    parameter   SUBU  = 6'b100011;
    parameter   AND   = 6'b100100;  
    parameter   OR    = 6'b100101;    
    parameter   XOR   = 6'b100110;   
    parameter   NOR   = 6'b100111;           
    parameter   SLT   = 6'b101010;                  
    parameter   SLL   = 6'b000000;
    parameter   SRL   = 6'b000010;
    parameter   SRA   = 6'b000011;
    parameter   JR    = 6'b001000;
   
    parameter   LUI_ALU = 4'b0000;
    parameter   ADD_ALU = 4'b0001;
    parameter   SUB_ALU = 4'b0010;
    parameter   AND_ALU = 4'b0011;
    parameter   OR_ALU  = 4'b0100;
    parameter   XOR_ALU = 4'b0101;
    parameter   NOR_ALU = 4'b0110;
    parameter   SLT_ALU = 4'b0111;
    parameter   SLL_ALU = 4'b1000;
    parameter   SRL_ALU = 4'b1001;
    parameter   SRA_ALU = 4'b1010;
    parameter   JR_ALU  = 4'b1011;
    parameter   SL_ALU  = 4'b1100;
    
    always @(*) begin
        case(alu_op)
            SL_ALUOP: alu_ctr = SL_ALU;
            BR_ALUOP: alu_ctr = SUB_ALU;
            LU_ALUOP: alu_ctr = LUI_ALU;
            AL_ALUOP:
            begin
                case(fun)
                    ADD: alu_ctr  = ADD_ALU;  
                    ADDU: alu_ctr = ADD_ALU;  
                    SUB: alu_ctr  = SUB_ALU;  
                    SUBU: alu_ctr = SUB_ALU;
                    AND: alu_ctr  = AND_ALU;  
                    OR: alu_ctr   = OR_ALU;   
                    XOR: alu_ctr  = XOR_ALU;  
                    NOR:alu_ctr   = NOR_ALU;
                    SLT: alu_ctr  = SLT_ALU;  
                    SLL:alu_ctr   = SLL_ALU;
                    SRL:alu_ctr   = SRL_ALU;
                    SRA:alu_ctr   = SRA_ALU;
                    JR: alu_ctr   = JR_ALU;
                endcase
            end
            ADDI_ALUOP : alu_ctr=ADD_ALU;
            ORI_ALUOP  : alu_ctr=OR_ALU;
            ANDI_ALUOP : alu_ctr = AND_ALU;
            XORI_ALUOP : alu_ctr = XOR_ALU;
            SLTI_ALUOP : alu_ctr = SLT_ALU;
            
            default:
                alu_ctr = 4'bxxxx;
           
        endcase
    end
endmodule //alu_ctr